GDB调试 |
您所在的位置:网站首页 › gdb多线程调试 错误 › GDB调试 |
引言 Linus心灵鸡汤 在*nix开发中有道卡叫gdb调试,不管你怎么搞. 它依然在那丝毫不会松动.今天致敬一个 活着的传奇 Linus Torvalds Unix 始于上个世纪60年代,在70年代得到了迅猛的发展, 这时候的李纳斯还躺在祖父公寓的摇篮里睡大觉,如果不是后来 Unix 王国自乱阵脚, 出现阵营分裂和法律纠纷,可能 Linux 系统根本都不会出现。真实的情况是, Unix 浪费了大把的时间和机会,似乎就是为了等待这个大鼻子、头发纷乱的芬兰小子长大,然后一决高下。 李纳斯赢得了自己的时间,他一刻不停的磨练自己的技艺,在清晨的微光中练习算法, 在赫尔辛基的雪山上编译代码,随时随地补充的粮草和武器。 二十一年之后,李纳斯抚着雪亮的刀锋上路了,他要去追寻属于程序员的最高荣耀。[ I simply know better than you, that's why I'm your god. - - Linus Torvalds ]
前言 gdb 开始调试开始上手 1. 开启core, 采集程序崩溃的状态 首先你跟着我做开启core崩溃状态采集. 可以通过 ulimit -c 查看 如果是0表示没有开启. 开启按照下面操作 上面shell 操作是 在 /etc/profile 最后一行添加 上面设置全局开启 core文件调试,大小不限. 最后 立即生效. 再跟着我做, 因为生成的core文件同名会覆盖. 这里为其加上一个 core命名规则, 让其变成 [core.pid] 格式. 在 /etc/sysctl.conf 文件中添加系统配置. 后面立即启用. 最后是下面状态表示core启用都搞好了. (上面是ubuntu 15.10 环境中, 后面测试用的是centos 6.4)
2. 简单接触 GDB , 开始调试 r n p 第一个演示代码 heoo.c 我们下面从图说起.(如果用视频说更好,文字和图意义在于查询方便.更简约) 第一个命令 gdb heoo.out 表示 gdb加载 heoo.out 开始调试. 如果需要使用gdb调试的话编译的时候 gcc 需要加上 -g命令. 其中l命令表示 查看加载源码内容. 下面将演示如何加断点. r 表示调试的程序开始运行. p 命令表示 打印值. n表示过程调试, 到下一步. 不管子过程如何都不进入. 直接一次跳过. 上面用的s 表示单步调试, 遇到子函数,会进入函数内部调试. 总结一下 . l 查看源码 , b 加断点, r 开始运行调试, n 下一步, s下一步但是会进入子函数. p 输出数据. 到这里gdb 基本会用了. 是不是也很容易. 直白. 小代码可以随便调试了. 看到这里基础知识普及完毕了. 后面可以不看了. 有机会再看. 好那我们接着扯.
正文 第一部分 gdb其它开发中用的命令 开始扯一点, linux总是敲命令操作, 也很不安全. 有时候晕了. 写这样编译命令. gcc -g -Wall -o heoo.c heoo.out非常恐怖, heoo.c 代码删除了. heoo.out => heoo.c 先创建后生成失败退出. 原先的内容被抹掉了. 哈哈. 服务器开发, 经验不足, 熟练度不够.自己都怕自己. 1. gdb 其它常用命令用法 c q b info 首先看 用到的调试文件 houge.c 按 Ctrl+C 复制代码
按 Ctrl+C 复制代码 同样需要仔细看下面图中使用的命令. 首先对前言部分加深一些. 看下面 这个图是前言的补充, c跳过直到下一个断点处, q表示程序退出. 在 houge.c 中我们开始调试. 一运行段错误, 出现了我们的 core.pid 文件 通过 gdb houge.out core.27047 开始调试. 马上定位出来了错误原因. 2. 调试 内存堆栈信息 刚开始 print a , 在main中当做数组处理.打印的信息多. 后面在_add函数中, a就是个形参数组地址. 主要看 info args 查看当前函数参数值 info locals 看当前函数栈上值信息, info registers 表示查看寄存器值. 后面查看内存信息 需要记得东西多一些. 先看图 x /23dw a 意思是 查看 从a地址开始 23个 4字节 有符号十进制数 输出. 关于x 更加详细见下面 这个命令常用于监测内存变化.调试中特别常用. 3. gdb 设置条件断点 很简单 b 17 if i == 8. 在17行设置一个断点,并且只有i==8的时候才会触发. 4. gdb 删除断点 gdb 删除有d 后面跟断点索引1,2,3.. clear 行数或名称. 删除哪一行断点. 看下面演示 到这里 介绍的gdb调试技巧基本都够用了. 感觉用图形ide,例如vs调试也就用到这些了. 估计gdb调试突破20min过去了.够用了. 后面可以不用看了.
正文 第二部分 gdb 多线程多进程调试 到这里实战中用的机会少了, 也就老鸟会用上些. 这部分可以调试,不好调试. 一般一调估计小半天就走了. 好,那我们处理最后10min. 1. 首先对上面正文第一部分加深 gdb调试宏 首先看上面命令 macro expand 宏(参数) => 得到宏导出内容. info macro 宏名 => 宏定义内容 如果你需要用到上面gdb功能, 查看和导出宏的话.还需要gcc 支持,生成的时候加上 -ggdb3如下 gcc -Wall -ggdb3 -o houge.out houge.c就可以使用了. 扩展一下 对于 gcc 编译的有个过程叫做 预编译 gcc -E -o *.i *.c. 这时候处理多数宏,直接展开, 也可以查看最后结果. 也算也是一个黑科技. 2. 开始多线程调试 首先看测试用例 dasheng.c |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |